Superfolia | source code

# Author: Tom De Smedt, 2006
zoom = 3
size(2012.6/zoom, 2863/zoom)
bg = [
color(0.70, 0.70, 0.65),
color(0.97, 0.97, 0.92)
]
colors = [
color(0.57, 0.57, 0.44),
color(0.29, 0.27, 0.08),
color(0.16, 0.16, 0.05),
color(0, 0, 0),
color(0, 0, 0)
]
colors.reverse()
# Given a list of colors,
# calculate intermediary steps.
# The plants go from black to green,
# giving them a nice sense of depth.
def gradient(colors, i, n):
l = len(colors)-1
a = int(1.0*i/n*l)
a = min(a+0, l)
b = min(a+1, l)
base = 1.0 * n/l * a
d = (i-base) / (n/l)
r = colors[a].r*(1-d) + colors[b].r*d
g = colors[a].g*(1-d) + colors[b].g*d
b = colors[a].b*(1-d) + colors[b].b*d
return color(r, g, b)
# Radial gradient background.
from math import sqrt
n = 800/zoom
r = sqrt(WIDTH*WIDTH + HEIGHT*HEIGHT)
for i in range(n):
dx = (WIDTH-r)/2
dy = (HEIGHT-r)/2
fill(gradient(bg, i, n))
oval(dx+i, dy+i, r-i*2, r-i*2)
svg = ximport("svg")
paths = svg.parse(open("plant.svg").read())
points = 100 # this will take a while to render.
nofill()
stroke(0)
strokewidth(0.5)
transform(CORNER)
scale(4.5 / zoom)
translate(-110, 35)
# Quick preview of the SVG:
#for path in paths:
# if random() > 0.25:
# drawpath(path)
for path in paths:
if path.length > 900:
n = points * 2
d = 10
else:
n = points
d = 30
prev = None
autoclosepath(False)
nofill()
for i, pt in zip(range(n), path.points(n)):
clr = gradient(colors, i, n)
clr.alpha = 0.7 + random(0.3)
stroke(clr)
strokewidth(random(0.04,0.2) * zoom)
if prev != None:
beginpath(prev.x, prev.y)
curveto(
pt.ctrl1.x - random(d),
pt.ctrl1.y,
pt.ctrl2.x,
pt.ctrl2.y + random(d),
pt.x,
pt.y
)
curveto(
pt.ctrl1.x + random(d/3),
pt.ctrl1.y,
pt.ctrl2.x,
pt.ctrl2.y - random(d/3),
pt.x + random(-d*2/3, d*2/3),
pt.y + random(-d/3, d/3)
)
endpath()
prev = pt